package bc.sistema.usuario.seguranca;

import bc.exceptions.RespostaInvalidaException;
import java.util.ArrayList;
import java.util.List;

/**
 * Classe PerguntaSecreta
 *
 * @author Felipe Miranda Medeiros
 * @version 1.0
 */
public final class PerguntaSecreta {

    private static final List<String> perguntas = new ArrayList<String>() {
        {
            add("Local de nascimento da mãe");
            add("Melhor amigo de infância");
            add("Nome do primeiro animal de estimação");
            add("Professor favorito");
            add("Melhor amigo de infância");
            add("Personagem histórico favorito");
            add("Cidade favorita");
        }
    };
    private int id;
    private String resposta;

    /**
     * Construtor de PerguntaSecreta
     *
     * @param id Um id da pergunta válido (0-6).
     * @param resposta Uma resposta com 5 ou mais caracteres.
     * @throws RespostaInvalidaException Se a resposta não compreender a
     * exigencia de pelo menos 5 caracteres.
     */
    public PerguntaSecreta(int id, String resposta) throws RespostaInvalidaException {
        setResposta(resposta);
        setId(id);
    }

    private void setId(int id) throws IndexOutOfBoundsException {
        idValido(id);
        this.id = id;
    }

    private void setResposta(String resposta) throws RespostaInvalidaException {
        if (resposta == null) {
            throw new RespostaInvalidaException("Resposta null");
        }
        if (!respostaValida(resposta)) {
            throw new RespostaInvalidaException("Resposta curta");
        }
        this.resposta = resposta.toLowerCase();
    }

    /**
     * Verifica se dado uma resposta ela atenda as exigências mínimas,
     * exigências essas não ser null e ter 5 caracteres ou mais.
     *
     * @param reposta Resposta a ser validada.
     * @return True se ela atende com as exigências mínimas, e caso contrário
     * False.
     */
    public static boolean respostaValida(String reposta) {
        if (reposta == null || reposta.length() < 5) {
            return false;
        }
        return true;
    }

    /**
     * Retorna a pergunta escolhida pelo usuário.
     *
     * @return A pergunta escolhida pelo usuário.
     */
    public String getPergunta() {
        return perguntas.get(id);
    }

    /**
     * Retorna uma determinada pergunta.
     *
     * @param id Um id da pergunta válido (0-6).
     * @return Pergunta desejada.
     * @throws IndexOutOfBoundsException Se o id passado não estiver entre 0-6.
     */
    public String getPergunta(int id) throws IndexOutOfBoundsException {
        idValido(id);
        return perguntas.get(id);
    }

    private void idValido(int id) throws IndexOutOfBoundsException {
        if (id < 0 || id > perguntas.size()) {
            throw new IndexOutOfBoundsException("Pergunta inexistente");
        }
    }

    /**
     * Verifica se dado uma resposta ela é igual à passada pelo usuário.
     *
     * @param resposta Resposta a ser validada.
     * @return True se a reposta passada conferir com a dada pelo usuário no ato
     * do cadastramento, caso contrário retornará False.
     */
    public boolean validarResposta(String resposta) {
        if (resposta == null || !resposta.toLowerCase().equals(this.resposta)) {
            return false;
        }
        return true;
    }

    /**
     * Define uma nova pergunta e resposta.
     *
     * @param id Um id da pergunta válido (0-6).
     * @param resposta Uma resposta com 5 ou mais caracteres.
     * @throws IndexOutOfBoundsException Se o id passado não estiver entre 0-6.
     * @throws RespostaInvalidaException Se a resposta não compreender a
     * exigencia de pelo menos 5 caracteres.
     */
    public void novaPergunta(int id, String resposta) throws IndexOutOfBoundsException, RespostaInvalidaException {
        idValido(id);
        setResposta(resposta);
        setId(id);
    }

    /**
     * Retorna uma lista de perguntas.
     *
     * @return Uma lista de perguntas.
     */
    public static List<String> getPerguntas() {
        return perguntas;
    }
}
